home *** CD-ROM | disk | FTP | other *** search
- ;**************************
- ;* *
- ;* High-C用 OAK2ライブラリー *
- ;* Programmed by 山崎憲明 *
- ;* NIFTY ID=QGB01416 *
- ;* nanno-NET ID= YAMA *
- ;* *
- ;**************************
- ;
- ;このプログラムにおいては、High-C<=>プロテクトモードアセンブラ<=>
- ;リアルモードアセンブラ<=>High-Cという相互呼出しを行っています。
- ;
- ;この動作について、詳しく知りたい方は、以下の文献を参照してください。
- ;(プロテクト<=>リアルモード) Dos-Extender p.30 p35 p.99-102
- ;(High-C<=>プロテクト) High-C 第一部 9章、14章
- ;(参考プログラム) High-C付属サンプル 'tail.c'
- ;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;
- ; v0.01 Makeing by YAMA cyan
- ; v0.02 ユ-ザ-関数仕様変更 YAMA (Reqest by Ken)
- ; v0.02a KYB_open()でのmode_chgを復活 by Ken
- ; v0.03 デバッグ用のゴミを除去 by YAMA
- ; v0.04 ネイティブダータが64kを越える場合に起こるlink障害除去 by YAMA
- ; v0.04a KYB_readのenc_cntのバグ修正及びkancnvflgの追加 by Ken
- ;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;
- ;セグメント宣言
- ;
- rmcode segment word public use16
- rmcode ends
- rmdata segment dword public 'DATA' use16
- rmdata ends
- pmdata segment dword public 'DATA' use32
- pmdata ends
- pmcode segment dword public 'CODE' use32
- pmcode ends
- DGROUP group rmdata,pmdata
-
- ;
- ;定数
- ;
- STACK_R equ 4*1024 ;リアル=>プロテクト(High-C)用に確保すべきスタック量
- ; ;(デフォルト:4 Kbytes : putstr, putsysがこの量以上に
- ; ;スタックを使用すると、スタックが破壊されるので
- ; ;要注意!!
-
- TRUE equ 1
- FALSE equ 0
- ;
- ;キーアドレス
- ;
- sCAP equ 55h
- sHIRA equ 56h
- sKATA equ 5Ah
-
- sEIJI equ 6Ah
- sEIKO equ 6Fh
- sMUHEN equ 57h
- sHENKAN equ 58h
-
- sKANJI equ 59h
- sZENHAN equ 71h
-
- ;
- ;モ-ドフラグ
- ;
- mKANJI equ 0002h
- mROMA equ 0008h
- mZEN equ 0020h
- mKATA equ 0080h
- mHIRA equ 0100h
-
- ;
- ; かな漢字変換用構造体定義
- ;
- Funcparm struc
- wFunc dw ?
- wMode dw ?
- lpKkname dd far
- lpDataparm dd far
- wHandle dw ?
- Reserved_f db 2 dup(0)
- Funcparm ends
-
- Kkname struc
- wLevel dw ?
- rgchName db 8 dup(?)
- rgchVersion db 4 dup(?)
- rgchRevision db 4 dup(?)
- Reserved_k db 14 dup(0)
- Kkname ends
-
- Dataparm struc
- wType dw 0
- wScan dw 0
- wAscii dw 0
- wStatus dw 0
-
- cchResult dw 0
- lpchResult dd far
-
- cchMode dw 0
- lpchMode dd far
- lpattrMode dd far
-
- cchSystem dw 0
- lpchSystem dd far
- lpattrSystem dd far
-
- cchBuf dw 0
- lpchBuf dd far
- lpattrBuf dd far
- cchBufCursor dw 0
- cchBufAct dw 0
-
- cchHomonym dw 0
- lpchHomonym dd far
- cchHomonymAct dw 0
- cchHomonymTotal dw 0
- cchHomonymNum dw 0
-
- fKanji dw ?
- fNtype dw ?
-
- Reserved_d db 16 dup(0)
- Dataparm ends
-
- ;
- ;
- ;
- MAX_X equ 80
- MAX_Y equ 24
-
- ;
- ;リアルモードデータセグメント
- ;
-
- rmdata segment
- ;
- ;
- ;
- call_port dd far ;リアル=>プロテクト呼出しポート
- rm_seg dw ? ;リアルモードセグメント値
-
- save_rt_ofs dw ?
- ;
- ; データ領域
- ;
- public modeW
-
- fnc Funcparm <>
- knm Kkname <>
- dat Dataparm <>
- buf_size equ 100
- buf db 8 dup(buf_size dup(0))
- Slock db FALSE
- modeW dw 0056h or 8000h
- modeS db '漢 英小',0
- sw dw 0
- enc dw 0
- key_c dw 0
- kancnvflg db 0 ; Apend OAKLIB by Ken
- old_cchS dw 0
- old_cchB dw 0
-
- cchR_p dw 0
- k_kind db ?
- key_tbl db 16 dup(?)
-
- enc_cnt dw 0 ;bug fixed at v1.00
- enc_str db 7 dup (0)
-
- public end_real ;リアルモードエンドアドレス
- end_real label byte
-
- rmdata ends
-
- ;
- ;プロテクトモードデータセグメント
- ;
-
- pmdata segment
-
- save_esp_p dd ?
- save_ss_p dw ? ; Selecter era ! LSS esp,save_esp_p
- save_esp_r dd ?
- save_ss_r dw ? ; Selecter era ! lss esp,save_esp_r
- ;
- ;表示関数(ユーザー定義)
- ;
- putstr_p dd near
- putsys_p dd near
- putmode_p dd near
-
- putstr_fp dd offset pmcode:putstr_f ;Bug Fixed at v0.04
- putsys_fp dd offset pmcode:putsys_f ;
- putmode_fp dd offset pmcode:putmode_f ;
-
- pmdata ends
-
- ;
- ;
- ;
- assume cs:pmcode,ds:DGROUP
-
- ;
- ;プロテクトモードーコード
- ;
-
- pmcode segment
-
- ;
- ;プロテクトルーチン
- ;
-
- ;
- ;call_real:プロテクト=>リアルプロシジャ呼出しルーチン
- ; AX=呼び出す関数のリアルオフセット
-
- call_real proc near
- mov save_ss_p,ss ; SS Selcter save
- mov save_esp_p,esp ;リアル=>プロテクト呼出し用スタック確保
- sub esp,STACK_R
- mov bx,rm_seg ;リアルモードセグメント設定
- shl ebx,16 ;
- mov bx,ax ;リアルモードオフセット
- xor ecx,ecx ;0 word パラメーター
- mov ax,250Eh ;リアルプロシジャ呼出し
- int 21h
- add esp,STACK_R ;リアル=>プロテクト呼出し用スタック解放
- ret
- call_real endp
-
- ;かな漢システムオープン
- ;int KAN_open(void (*putstr)(), void (*putsys)(),void (*putmode)() );
- ;
- public KAN_open
- KAN_open proc near
-
- push ebp ;High-C用ヘッダー
- mov ebp,esp
- push esi
- push edi
- push ebx
- push es
-
- ;リアルモード呼出し用初期化ルーチン
- mov ax,250Dh ;リアル=>プロテクト呼出し用
- int 21h ;プロシジャアドレス取得
- mov dword ptr call_port,eax
-
- mov ax,ds ;リアルモード用セグメント算定
- mov es,ax ;先頭アドレス
- xor ebx,ebx ;
- lea ecx,end_real ;リアルモードコードセグメントサイズ
- mov ax,250Fh ;プロテクト=>リアルアドレス変換
- int 21h
- ;jc err ;エラー処理
- ;test ecx,0FFFFh ;
- ;jnz err ;
- shr ecx,16
- mov rm_seg,cx ;リアルモードセグメント値保存
- ;
- ;かな漢変換システム初期化
- mov esi,[ebp][16] ;引数 3( void (*putmode)() )
- mov putmode_p,esi
- mov esi,[ebp][12] ;引数 2( void (*putsys)() )
- mov putsys_p,esi
- mov esi,[ebp][8] ;引数 1( void (*putstr)() )
- mov putstr_p,esi
-
- lea ax,KAN_open_s ;プロシジャ KAN_open_s
- call call_real
-
- pop es
- pop ebx ;High-C用後処理
- pop edi
- pop esi
- mov esp,ebp
- pop ebp
- ret
- KAN_open endp
-
- ;かな漢システムクローズ
- ;int KAN_close();
- ;
- public KAN_close
- KAN_close proc near
-
- push ebp ;High-C用ヘッダー
- mov ebp,esp
- push esi
- push edi
- push ebx
- push es
-
- lea ax,KAN_close_s ;プロシジャ KAN_close_s
- call call_real
-
- pop es
- pop ebx ;High-C用後処理
- pop edi
- pop esi
- mov esp,ebp
- pop ebp
- ret
- KAN_close endp
-
- ;キー読み取り(かな漢変換付き)
- ;int KAN_read(int sw, unsigned *enc );
- ;
- public KAN_read
- KAN_read proc near
-
- push ebp ;High-C用ヘッダー
- mov ebp,esp
- push esi
- push edi
- push ebx
- push es
- push ebp
-
- mov eax,[ebp][8] ;引数 1( int sw )
- mov sw,ax
-
- lea ax,KAN_read_s ;プロシジャ KAN_read_s
- call call_real
-
- pop ebp
- xor eax,eax
- mov ax,enc
- mov edi,[ebp][12] ;引数 2( unsigned *enc )
- mov [edi],eax ;
- mov ax,key_c ;リターン:キーコード
-
- pop es
- pop ebx ;High-C用後処理
- pop edi
- pop esi
- mov esp,ebp
- pop ebp
- ret
- KAN_read endp
-
- ;単語登録
- ;int KAN_touroku(int len, char *tango );
- ;
- public KAN_touroku
- KAN_touroku proc near
-
- push ebp ;High-C用ヘッダー
- mov ebp,esp
- push esi
- push edi
- push ebx
- push es
- push ebp
-
- mov esi,[ebp][12] ;引数 2( char *tango )
- mov ecx,[ebp][8] ;引数 1( int len )
- mov dat.cchResult,cx
- xor edi,edi
- mov di,word ptr dat.lpchResult
- rep movsb
-
- lea ax,KAN_touroku_s ;プロシジャ KAN_read_s
- call call_real
-
- pop ebp
-
- pop es
- pop ebx ;High-C用後処理
- pop edi
- pop esi
- mov esp,ebp
- pop ebp
- ret
- KAN_touroku endp
-
-
- ;
- ;リアル=>High-C呼出し用プロシジャ:
- ;<解説> Dos-Extenderによるリアル=>プロテクト呼出しは、プロテクトFARコール
- ;によって行われるため、プロテクトNEARプロシジャであるHigh-C関数を呼び出すには、
- ;この様に中継用のプロシジャが必要となる。また、リアル=>プロテクト呼出しの為、
- ;スタックフレームがHigh-Cと共用出来ないのを防ぐため、予め用意したプロテクト側の
- ;スタックに切り換える。
- ;
-
- ; void putstr(int pos,int len,char *str,char *att);
- public putstr_f
- putstr_f proc far
- mov save_ss_r,ss ; Selecter Save
- mov save_esp_r,esp ;スタックフレーム再構築
- lss esp,pword ptr save_esp_p ; Load Loacl Stack Address
-
- xor eax,eax
- mov ax,word ptr dat.lpattrBuf ;引数 4( char *att )
- push eax
- mov ax,word ptr dat.lpchBuf ;引数 3( char *str )
- push eax
- mov ax,dat.cchBuf ;引数 2( int len )
- push eax
- mov ax,dat.cchBufCursor ;引数 1( int pos )
- push eax
- call putstr_p
- add esp,4*4 ;引数pop
-
- lss esp,pword ptr save_esp_r
- ret
- putstr_f endp
-
- ; void putsys(int len, char *str, char *att);
- public putsys_f
- putsys_f proc far
- mov save_ss_r,ss ; Selecter Save
- mov save_esp_r,esp ;スタックフレーム再構築
- lss esp,pword ptr save_esp_p ; Load Loacl Stack Address
-
- xor eax,eax
- mov ax,word ptr dat.lpattrSystem ;引数 3( char *att )
- push eax
- mov ax,word ptr dat.lpchSystem ;引数 2( char *str )
- push eax
- mov ax,dat.cchSystem ;引数 1( int len )
- push eax
- call putsys_p
- add esp,3*4 ;引数pop
-
- lss esp,pword ptr save_esp_r
- ret
- putsys_f endp
-
- ; void putmode(int mode, int shift, char *str);
- public putmode_f
- putmode_f proc far
- mov save_ss_r,ss ; Selecter Save
- mov save_esp_r,esp ;スタックフレーム再構築
- lss esp,pword ptr save_esp_p ; Load Loacl Stack Address
-
- xor eax,eax
- mov ax,offset modeS ;引数 3( char *str )
- push eax
- mov ax,enc ;引数 2( int shift )
- and ax,00FFh
- push eax
- mov ax,modeW ;引数 1( int mode )
- push eax
- call putmode_p
- add esp,3*4 ;引数pop
-
- lss esp,pword ptr save_esp_r
- ret
- putmode_f endp
-
- pmcode ends
-
- ;
- ;リアルモードコード
- ;
-
- rmcode segment word public use16
-
- assume cs:rmcode,ds:DGROUP
-
- ;
- ;call_prot:リアル=>プロテクト呼出しルーチン
- ; EAX=呼び出す関数のネイティブオフセット
-
- call_prot proc near
- pop [save_rt_ofs]
- push dword ptr 0 ;データセグメントは初期設定値
- push word ptr 0Ch ;プロテクトモードセレクタ
- push eax ;呼び出す関数のネイティブオフセット
- call call_port ;プロテクトプロシジャ呼出し
- add sp,10
- push [save_rt_ofs]
- ret
- call_prot endp
-
- ;
- ; かな漢字変換関数
- ;
- KKfunc proc near
- push es
- push ds
- push bx
- push cx
- push dx
- push si
- push di
- mov ax,cs
- mov ds,ax
- mov es,ax
-
- mov ax,fnc.wFunc
- mov bx,offset fnc
- mov cx,offset fnc
- mov dx,offset fnc
- mov di,offset fnc
- mov si,offset fnc
-
- int 0EEh
- pop di
- pop si
- pop dx
- pop cx
- pop bx
- pop ds
- pop es
- ret
- KKfunc endp
-
- KKOpen proc near
- mov fnc.wFunc,2
- mov fnc.wHandle,1
- mov ax,ds
- mov word ptr fnc.lpKkname,offset knm
- mov word ptr fnc.lpKkname+2,ax
- mov word ptr fnc.lpDataparm,offset dat
- mov word ptr fnc.lpDataparm+2,ax
- mov dat.wType,1
- call KKfunc
- ret
- KKOpen endp
-
- KKClose proc near
- mov fnc.wFunc,3
- mov fnc.wMode,0
- mov word ptr fnc.lpKkname,0
- mov word ptr fnc.lpKkname+2,0
- mov word ptr fnc.lpDataparm,0
- mov word ptr fnc.lpDataparm+2,0
- call KKfunc
- ret
- KKClose endp
-
- KKInOut proc near
- mov fnc.wFunc,4
- mov fnc.wMode,0
- mov word ptr fnc.lpKkname,0
- mov word ptr fnc.lpKkname+2,0
- mov ax,ds
- mov word ptr fnc.lpDataparm,offset dat
- mov word ptr fnc.lpDataparm+2,ax
-
- mov word ptr dat.lpchResult,offset buf[0]
- mov word ptr dat.lpchResult+2,ax
- mov word ptr dat.lpchMode,offset buf[1*buf_size]
- mov word ptr dat.lpchMode+2,ax
- mov word ptr dat.lpattrMode,offset buf[2*buf_size]
- mov word ptr dat.lpattrMode+2,ax
- mov word ptr dat.lpchSystem,offset buf[3*buf_size]
- mov word ptr dat.lpchSystem+2,ax
- mov word ptr dat.lpattrSystem,offset buf[4*buf_size]
- mov word ptr dat.lpattrSystem+2,ax
- mov word ptr dat.lpchBuf,offset buf[5*buf_size]
- mov word ptr dat.lpchBuf+2,ax
- mov word ptr dat.lpattrBuf,offset buf[6*buf_size]
- mov word ptr dat.lpattrBuf+2,ax
- mov word ptr dat.lpchHomonym,offset buf[7*buf_size]
- mov word ptr dat.lpchHomonym+2,ax
- call KKfunc
- ret
- KKInOut endp
-
- KKMode proc near
- mov fnc.wFunc,5
- mov word ptr fnc.lpKkname,0
- mov word ptr fnc.lpKkname+2,0
- mov ax,ds
- mov word ptr fnc.lpDataparm,offset dat
- mov word ptr fnc.lpDataparm+2,ax
- call KKfunc
- ret
- KKMode endp
-
- KKTrans proc near
- mov fnc.wFunc,6
- mov fnc.wMode,0
- mov word ptr fnc.lpKkname,0
- mov word ptr fnc.lpKkname+2,0
- mov ax,ds
- mov word ptr fnc.lpDataparm,offset dat
- mov word ptr fnc.lpDataparm+2,ax
- mov fnc.wHandle,1
-
- mov byte ptr dat.wScan,0
- mov byte ptr dat.wAscii,0
- mov byte ptr dat.wStatus,0
- mov word ptr dat.lpchMode,0
- mov word ptr dat.lpchMode+2,0
- mov word ptr dat.lpattrMode,0
- mov word ptr dat.lpattrMode+2,0
- mov word ptr dat.lpchSystem,offset buf[3*buf_size]
- mov word ptr dat.lpchSystem+2,ax
- mov word ptr dat.lpattrSystem,offset buf[4*buf_size]
- mov word ptr dat.lpattrSystem+2,ax
- ; mov word ptr dat.lpchBuf,0
- ; mov word ptr dat.lpchBuf+2,0
- ; mov word ptr dat.lpattrBuf,0
- ; mov word ptr dat.lpattrBuf+2,0
- mov word ptr dat.lpchHomonym,0
- mov word ptr dat.lpchHomonym+2,0
- call KKfunc
- ret
- KKTrans endp
-
- ;
- ;
- ;
-
- KYB_check macro
- mov ah,07h
- int 90h
- endm
-
- KYB_read macro sw
- mov ah,09h
- mov al,sw
- int 90h
- endm
-
- KYB_matrix macro
- mov di,offset key_tbl
- mov ah,0Ah
- int 90h
- endm
-
- KYB_KindKb macro
- mov ah,0FAh
- int 90h
- endm
-
- KYB_setShift macro
- mov ah,0FCh
- int 90h
- endm
-
- movKs macro index,code
- mov word ptr modeS[index],((code shl 8)or(code shr 8))and 0FFFFh
- endm
-
- KYB_read2_s proc near
- kr2s_lp1: call KYBN_check
- cmp dh,0FFh
- je kr2s_lp1
- mov ax,0900h
- int 90h
- push ax
- push bx
- push cx
- push dx
- mov cl,bh
- kr2s_apn31: mov ah,07h
- int 90h
- cmp dh,0ffh
- je kr2s_apn4
-
- cmp bh,cl
- jne kr2s_apn4
-
- cmp bh,4dh
- je kr2s_apn32
- cmp bh,4fh
- je kr2s_apn32
- cmp bh,50h
- je kr2s_apn32
- cmp bh,51h
- je kr2s_apn32
- cmp bh,4Bh
- je kr2s_apn32
- cmp bh,4Eh
- je kr2s_apn32
- cmp bh,48h
- je kr2s_apn32
- cmp bh,72h
- je kr2s_apn32
- cmp bh,73h
- jne kr2s_apn4
-
- kr2s_apn32: mov ax,0900h
- int 90h
- jmp kr2s_apn31
- kr2s_apn4:
- pop dx
- pop cx
- pop bx
- pop ax
- ret
- KYB_read2_s endp
-
- KYB_read2 macro
- call KYB_read2_s
- endm
-
- key_test macro scan
- test key_tbl[scan/8],(1 shl (scan mod 8))
- endm
-
- key_break macro scan
- local lp
- lp: KYB_matrix
- key_test scan
- jnz short lp
- endm
-
- putstr_r proc near
- mov eax,[putstr_fp] ;Bug Fixed at v0.04
- call call_prot
- mov ax,dat.cchBuf
- mov old_cchB,ax
- ret
- putstr_r endp
-
- putsys_r proc near
- mov eax,[putsys_fp] ;Bug Fixed at v0.04
- call call_prot
- mov ax,dat.cchSystem
- mov old_cchS,ax
- ret
- putsys_r endp
-
- ;
- ;空文字列出力:KAN_readの処理が終わる時、このルーチンによって長さ0の
- ;文字列がputstr,putsysに出力される。(画面復元用)
- ;
- clrstr proc near
- push dat.cchBuf
- push dat.cchSystem
- mov dat.cchBuf,0
- mov dat.cchSystem,0
- mov eax,[putstr_fp] ;Bug Fixed at v0.04
- call call_prot
- mov eax,[putsys_fp] ;Bug Fixed at v0.04
- call call_prot
- mov old_cchB,0
- mov old_cchS,0
- pop dat.cchSystem
- pop dat.cchBuf
- ret
- clrstr endp
-
- ;
- ;
- ;
-
- mode_chg proc near
-
- push di
- push ax
- push cx
- push dx
-
- test modeW,01h
- jz short krn_edsk0
- mov modeW,8055h
- test bl,02h
- jz short krn_edsk0
- xor modeW,0C0h
-
- krn_edsk0: test modeW,0008h
- jne short krn_edsk1
- test modeW,180h
- jz short krn_edsk1
- or bl,02h
- mov al,bl
- jmp short krn_edsk2
-
- krn_edsk1: and bl,0FDh
- mov al,bl
- krn_edsk2: KYB_setShift
- test modeW,0002h
- je short krnc_sk11
- movKs 0,'漢'
- jmp short krnc_sk2
- krnc_sk11: movKs 0,' '
- krnc_sk2: test modeW,0008h
- je short krnc_sk21
- mov modeS[4],'R'
- jmp short krnc_sk3
- krnc_sk21: mov modeS[4],' '
- krnc_sk3: test modeW,0020h
- je short krnc_sk31
- movKs 2,'全'
- jmp short krnc_sk4
- krnc_sk31: movKs 2,' '
- krnc_sk4: test modeW,0040h
- je short krnc_sk42
- movKs 5,'英'
- test bl,01h
- je short krnc_sk411
- movKs 7,'大'
- jmp short krnc_sk5
- krnc_sk411: movKs 7,'小'
- jmp short krnc_sk5
- krnc_sk42: test modeW,0080h
- je short krnc_sk43
- movKs 5,'カ'
- movKs 7,'ナ'
- jmp short krnc_sk5
- krnc_sk43: movKs 5,'か'
- movKs 7,'な'
-
- krnc_sk5:
- mov enc,bx
- mov ax,modeW
- mov fnc.wMode,ax
- call KKMode
- mov eax,[putmode_fp] ;Bug Fixed at v0.04
- call call_prot
-
- pop dx
- pop cx
- pop ax
- pop di
- mov bx,enc
- ret
- mode_chg endp
-
- KYBN_check proc near
- KYB_matrix
- KYB_check
- cmp dh,0FFh
- je krn_sk1
-
- cmp dh,80h ;PF key?
- jne kcn_sk1
- ;
- ; For oyayubi shift
- ;
- cmp bh,57h ;
- je kcn_sk0
- cmp bh,58h ;
- jne kcn_sk01
- kcn_sk0: cmp k_kind,1 ;JIS?
- je kcn_sk01
- and modeW,803Fh
- or modeW,100h
- push dx
- push bx
- call mode_chg
- pop bx
- pop dx
- jmp kcn_sk2
- kcn_sk01: jmp kcn_sk3
-
- kcn_sk1: test modeW,0020h ;全角?
- jne kcn_sk2
- test modeW,0040h ;英数入力モード?
- jne kcn_sk3
- test modeW,0108h ;ローマ字入力モード or ひらがな?
- jne kcn_sk2
- jmp kcn_sk3 ;かな入力モード and かたかな.
-
- kcn_sk2: mov ah,0FFh ;変換の必要有り
- ret
- kcn_sk3: mov ah,0 ;変換の必要なし
- ret
- ;
- ; For JIS keybord
- ;
- krn_sk1: key_test sCAP
- jz short krn_sk2
- key_break sCAP
- jmp krn_end1
-
- krn_sk2: key_test sHIRA
- jz short krn_sk3
- test bl,10h ;CTRL
- jz short krn_sk22
- test Slock,TRUE
- jnz krn_sk21
- xor modeW,0Ch
- krn_sk21: key_break sHIRA
- jmp krn_end1
- krn_sk22: test Slock,TRUE
- jnz krn_sk23
- xor modeW,140h
- krn_sk23: test modeW,100h
- je short krn_sk21
- and modeW,813Fh
- jmp short krn_sk21
- krn_sk3: key_test sKATA
- jz short krn_sk4
- test Slock,TRUE
- jnz krn_sk32
- xor modeW,80h
- test modeW,80h
- je short krn_sk31
- and modeW,80BFh
- jmp short krn_sk32
- krn_sk31: and modeW,803Fh
- or modeW,40h
- krn_sk32: key_break sKATA
- jmp krn_end1
- ;
- ; For oyayubi shift keybord
- ;
- krn_sk4:
- key_test sEIJI
- jz short krn_sk5
- test bl,10h ;CTRL
- jz short krn_sk42
- test Slock,TRUE
- jnz krn_sk41
- xor modeW,0Ch
- krn_sk41: key_break sEIJI
- jmp krn_end1
- krn_sk42: test Slock,TRUE
- jnz krn_sk41
- and modeW,803Fh
- or modeW,040h
- jmp short krn_sk41
-
- krn_sk5: key_test sEIKO
- jz short krn_sk6
- test Slock,TRUE
- jnz krn_sk52
- test modeW,040h
- jne krn_sk52
- and modeW,803Fh
- or modeW,080h
- krn_sk52: key_break sKATA
- jmp short krn_end1
- ;
- ;
- ;
- krn_sk6: key_test sZENHAN
- jz krn_sk7
- test Slock,TRUE
- jnz krn_sk61
- xor modeW,30h
- krn_sk61: key_break sZENHAN
- jmp krn_end1
- krn_sk7: key_test sKANJI
- jz short krn_end2
- test Slock,TRUE
- jnz krn_sk71
- xor modeW,03h
- krn_sk71: key_break sKANJI
-
- krn_end1: call mode_chg
- mov dx,0FFFFh
- mov bh,0FFh
- krn_end2: ret
- KYBN_check endp
-
-
- ;
- ;
- ;
- public KAN_touroku_s
- KAN_touroku_s proc far
- push bp
- mov bp,sp
- mov ax,cs
- mov ds,ax
- mov es,ax
-
- mov Slock,TRUE
-
- cmp dat.cchResult,0
- je ew_end
- call KKTrans
-
- ew_lp4: call putsys_r
-
- KYB_read2
- mov byte ptr dat.wType,0
- mov byte ptr dat.wScan,bh
- mov byte ptr dat.wAscii,dl
- mov byte ptr dat.wStatus,bl
- call KKInOut
- cmp dat.cchSystem,0
- jne ew_lp4
-
- ew_end: call clrstr
-
- mov Slock,FALSE
- mov dat.cchResult,0
- mov dat.cchBuf,0
- mov dat.cchSystem,0
-
- xor eax,eax
- err4: pop bp
- ret
- KAN_touroku_s endp
-
- public KAN_read_s
- KAN_read_s proc far
- push bp
- mov bp,sp
- mov ax,cs
- mov ds,ax
- mov es,ax
-
- mov cx,cchR_p
- cmp cx,dat.cchResult
- jae short kr_sk1
- mov si,word ptr dat.lpchResult
- add si,cx
- xor dh,dh
- mov dl,[si]
- mov bh,byte ptr dat.wScan
- cmp enc_cnt,0
- je v101_fx2
- xor bh,bh
- dec enc_cnt
- v101_fx2: mov bl,byte ptr dat.wStatus
- mov enc,bx
- mov key_c,dx
- inc cchR_p
- jmp kr_end23
-
- kr_sk1: cmp kancnvflg,0 ; Apend OAKLIB by Ken
- je ken_fix1
- mov kancnvflg,0
-
- cmp sw,1 ; No wait key in?
- jne ken_fix1
-
- mov bh,0FFH
- mov bl,byte ptr dat.wStatus
- mov dx,0FFFFh
- jmp ken_fix2 ; Return to Null Char
-
- ken_fix1: mov cchR_p,0
- mov dat.cchResult,0
-
- cmp word ptr dat.cchSystem,0
- je kr_sk101
- call putsys_r
-
- kr_sk101: cmp word ptr dat.cchBuf,0
- je short kr_lp1
- call putstr_r
-
- kr_lp1: call KYBN_check
- cmp dh,0FFh ;No key in?
- jne short kr_sk2 ;No.
- cmp sw,1 ;No wait key in?
- jne short kr_lp1 ;No.
- kr_lp11: cmp word ptr dat.cchBuf,0
- jne short kr_lp1
-
- kr_lp12: cmp bh,57h ;変換,無変換を返さない
- je kr_lp1 ;ようにした by Ken
- cmp bh,58h
- je kr_lp1
- ken_fix2: mov enc,bx
- mov key_c,dx
- jmp kr_end23
-
- kr_sk2: push ax
- mov ax,0900h ;dummy read
- int 90h
- pop ax
- cmp word ptr dat.cchBuf,0 ;未確定文字列があるか?
- jne kr_sk22
-
- kr_sk21: cmp ah,0FFh ;変換の必要ありか?
- jne kr_lp12 ;無。
-
- kr_sk22: mov byte ptr dat.wType,0
- mov byte ptr dat.wScan,bh
- mov byte ptr dat.wAscii,dl
- mov byte ptr dat.wStatus,bl
-
- mov si,offset enc_str
- mov enc_cnt,1
- mov [si],dl
- inc si
-
- ;Bug Fixed by K.MIYAZAKI
- ; Thanks a lot!!
- ;
- mov ah,1eh
- cmp bh,4dh
- je ken_apn2
- mov ah,1dh
- cmp bh,4fh
- je ken_apn2
- mov ah,1fh
- cmp bh,50h
- je ken_apn2
- mov ah,1ch
- cmp bh,51h
- je ken_apn2
-
- mov ah,7Fh
- cmp bh,4Bh
- je ken_apn2
- mov ah,0Bh
- cmp bh,4Eh
- je ken_apn2
-
- mov ah,1bh
- cmp bh,48h
- je ken_apn2
- cmp bh,6Dh
- je ken_apn2
- cmp bh,72h
- je ken_apn2
- cmp bh,73h
- jne ken_apn5
-
- ken_apn2:
- cmp old_cchS,0
- jne ken_apn3
- cmp old_cchB,0
- jne ken_apn3
- jmp kr_lp12
- ken_apn3:
- mov byte ptr dat.wAscii,ah
-
- push ax
- push bx
- push dx
- ken_apn31: mov ah,07h
- int 90h
- cmp dh,0ffh
- je ken_apn4
- cmp bh,byte ptr dat.wScan
- jne ken_apn4
- mov ax,0900h
- int 90h
- mov [si],dl
- inc si
- inc enc_cnt
- jmp ken_apn31
-
- ken_apn4:
- pop dx
- pop bx
- pop ax
- ken_apn5:
- ;
- ;
- ;
-
- call KKInOut
-
- cmp [dat.cchResult],0 ;No result string?
- jne kr_sk3 ;No.
-
- call putstr_r
-
- call putsys_r
-
- mov kancnvflg,1 ; Apend OAKLIB by Ken
-
- jmp kr_lp1
-
- kr_sk3:
- ; cmp dat.cchBuf,0 ; Wait is Code ? by Ken
- ; jne kr_sk301
-
- mov di,word ptr[dat.lpchResult]
- add di,dat.cchResult
- dec di
- mov si,offset enc_str
- mov cx,enc_cnt
-
- mov al,byte ptr dat.wAscii ;キーコードの復元が必要か?
- cmp al,[di]
- je kr_sk309 ; Do Cnvert
- dec enc_cnt ; エンコ-ドの禁止 by Ken
- jmp kr_sk301
-
- kr_sk309: repnz movsb
- mov cx,dat.cchResult
- add cx,enc_cnt
- dec cx
- mov dat.cchResult,cx
-
- kr_sk301: mov si,word ptr[dat.lpchResult]
- cmp dl,[si]
- je short kr_sk31
-
- kr_sk4: mov dl,[si]
- xor dh,dh
- xor bh,bh
-
- kr_sk31: mov enc,bx
- mov key_c,dx
-
- call clrstr
-
- mov cchR_p,1
- mov ax,dat.cchResult
- sub ax,enc_cnt
- dec ax
- jns kr_end20
- xor ax,ax
- kr_end20: mov enc_cnt,ax
- kr_end23:
- xor eax,eax
- err3: pop bp
- ret
- KAN_read_s endp
-
- public KAN_open_s
- KAN_open_s proc far
- push bp
- mov bp,sp
- mov ax,cs
- mov ds,ax
- mov es,ax
-
- KYB_KindKb ;キーボード種類
- mov k_kind,al
-
- call KKOpen ;oak/2 open
- or ax,ax
- jne err
- mov ax,modeW
- mov fnc.wMode,ax
- call KKMode
- or ax,ax
- jne err
- mov byte ptr dat.wType,0 ;リフレッシュ
- mov byte ptr dat.wScan,0
- mov byte ptr dat.wAscii,0
- mov byte ptr dat.wStatus,0
- call KKInOut
- or ax,ax
- jne err
- mov dat.cchResult,0
- mov dat.cchSystem,0
- mov dat.cchBuf,0
- mov old_cchS,0
- mov old_cchB,0
- mov cchR_p,0
-
- mov ah,07h ;set shift mode
- int 90h
- call mode_chg
-
- xor eax,eax
- err: pop bp
- ret
- KAN_open_s endp
-
- public KAN_close_s
- KAN_close_s proc far
- push bp
- mov bp,sp
- mov ax,cs
- mov ds,ax
- mov es,ax
-
- mov ah,07h
- int 90h
- or modeW,1 ;漢字off
- call mode_chg
- call KKClose
- or ax,ax
- jne err2
-
- xor eax,eax
- err2: pop bp
- ret
- KAN_close_s endp
-
- rmcode ends
-
- end